﻿using Common;
using OfficeOpenXml;
using SqliteDataAccess;
using SqliteDataAccess.SqliteDataManagerTableAdapters;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace Business
{
    public class LaporanBulananBusiness : BaseBusiness
    {
        public override int Load()
        {
            throw new NotImplementedException();
        }

        public int LoadByBulanTahun(String namaBulan, int tahun)
        {
            int bulan = (int)Enums.GetMonthByName(namaBulan);
            LaporanBulananTableAdapter laporanBulananTA = new LaporanBulananTableAdapter();
            return laporanBulananTA.Fill(LppbopSqlite.LaporanBulanan, bulan, tahun);
        }

        public override int Save()
        {
            LaporanBulananTableAdapter laporanBulananTA;
            try
            {
                laporanBulananTA = new LaporanBulananTableAdapter();
                return laporanBulananTA.Update(LppbopSqlite.LaporanBulanan);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }

        public int InsertLaporanBulanan(String bulan, int tahun)
        {
            int bln = (int)Enums.GetMonthByName(bulan);
            BukuKasUmumTableAdapter bukuKasUmumTA = new BukuKasUmumTableAdapter();
            SqliteDataManager.BukuKasUmumDataTable bukuKasUmum = bukuKasUmumTA.GetData(bln, tahun);

            if (bukuKasUmum.Count == 0)
            {
                return 0;
            }
            else 
            {
                // penerimaan = pengeluaran
                //long penerimaan = bukuKasUmum.TotalPenerimaan;
                long pengeluaran = bukuKasUmum.TotalPengeluaran;

                LaporanBulananTableAdapter laporanBulananTA = new LaporanBulananTableAdapter();
                SqliteDataManager.LaporanBulananDataTable laporanBulanan = laporanBulananTA.GetData(bln, tahun);

                if (laporanBulanan.Count == 0)
                {
                    SqliteDataManager.LaporanBulananRow newRow = laporanBulanan.NewLaporanBulananRow();
                    newRow.bulan = bln;
                    newRow.tahun = tahun;
                    newRow.no = "1.";
                    newRow.uraian_penerimaan = string.Format("Diterima Dana BOP bulan {0} {1}", bulan, tahun);
                    newRow.beban_pk_penerimaan = pengeluaran;
                    newRow.jumlah_penerimaan = pengeluaran;
                    newRow.uraian_pengeluaran = string.Format("Dibelanjakan Dana BOP bulan {0} {1}", bulan, tahun); ;
                    newRow.beban_pk_pengeluaran = pengeluaran;
                    newRow.jumlah_pengeluaran = pengeluaran;
                    laporanBulanan.AddLaporanBulananRow(newRow);
                }
                else
                {
                    SqliteDataManager.LaporanBulananRow row = laporanBulanan[0];
                    row.beban_pk_penerimaan = pengeluaran;
                    row.jumlah_penerimaan = pengeluaran;
                    row.beban_pk_pengeluaran = pengeluaran;
                    row.jumlah_pengeluaran = pengeluaran;
                }

                return laporanBulananTA.Update(laporanBulanan);
            }
        }

        public void PrintExcel(SqliteDataManager.LaporanBulananDataTable table)
        {
            string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".xlsx";
            WriteToExcel(fileName, table);

            try
            {
                ProcessStartInfo processInfo = new ProcessStartInfo();
                processInfo.FileName = fileName;
                processInfo.WindowStyle = ProcessWindowStyle.Hidden;
                processInfo.Verb = "Print";
                processInfo.CreateNoWindow = true;
                processInfo.UseShellExecute = true;
                Process process = Process.Start(processInfo);
                if (process != null)
                    process.WaitForExit();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                File.Delete(fileName);
            }
        }

        public void ExportToExcel(string filename, SqliteDataManager.LaporanBulananDataTable table)
        {
            WriteToExcel(filename, table);
        }

        public void WriteToExcel(string filename, SqliteDataManager.LaporanBulananDataTable table)
        {
            if (table.Count == 0) return;

            SqliteDataManager.ProfilSekolahRow profil = new ProfilBusiness().GetProfil();

            using (ExcelPackage package = new ExcelPackage(new FileInfo(String.Format(@"templates\{0}", "laporan-bulanan.xlsx"))))
            {
                ExcelWorksheet ws = package.Workbook.Worksheets[1];

                int row = 14;
                foreach (SqliteDataManager.LaporanBulananRow record in table.Rows)
                {
                    ws.Cells["A" + row].Value = record.no;
                    ws.Cells["B" + row].Value = record.uraian_penerimaan;
                    ws.Cells["C" + row].Value = record.beban_pk_penerimaan;
                    ws.Cells["D" + row].Value = record.jumlah_penerimaan;
                    ws.Cells["E" + row].Value = record.uraian_pengeluaran;
                    ws.Cells["F" + row].Value = record.beban_pk_pengeluaran;
                    ws.Cells["G" + row].Value = record.jumlah_pengeluaran;

                    row++;
                }

                // nama sekolah
                ws.Cells["C7"].Value = string.Format(": {0}", profil.sekolah);
                // tahun anggaran
                ws.Cells["C8"].Value = string.Format(": {0}", table[0].tahun);
                // bulan
                ws.Cells["C9"].Value = string.Format(": {0}", Enums.GetMonthByName(table[0].bulan.ToString()));
                // format penerimaan/pengeluaran
                ws.Cells["C14:D14,F14:G14"].Style.Numberformat.Format = "_(Rp* #,##0.00_);_(Rp* (#,##0.00);_(Rp* \" - \"??_);_(@_)";
                // tempat, tanggal
                ws.Cells["F16"].Value = string.Format("Jakarta, {0}", DateTime.Now.ToString("dd MMMM yyyy"));
                // ketua yayasan
                ws.Cells["B23"].Value = profil.ketua_yayasan;
                // kepala sekolah
                ws.Cells["D23"].Value = profil.kepala_sekolah;
                // bendahara sekolah
                ws.Cells["F23"].Value = profil.bendahara_sekolah;

                if (!filename.EndsWith("xlsx")) filename += ".xlsx";
                package.SaveAs(new FileInfo(filename));
            }
        }
    }
}
